flex是Flexible Box的缩写,意为“弹性布局”,是css3中作用于动态元素或者不知名大小元素的新布局,主要用于元素对齐、方向和容器的组织方式。flex容器最主要的特点是其能以最好的方式修改不同大小子元素的width和height,使其填满可用空间。
基础
flex布局由flex容器的父元素和其直接子元素flex items 组成。
用法
在父HTML元素上设置属性display就可以使用flex布局。1
2
3
4.flex-container {
display: -webkit-flex; //Safari
display: flex;
}
若想表现得像行内元素1
2
3
4.flex-container {
display: -webkit-inline-flex; //Safari
display: inline-flex;
}
父元素上只需设置这一个属性,其全部直接子元素会自动转变为flex items。
有许多方式能组织flexbox属性,但总的来说,最简便的还是将元素分为两个部分:flex容器和flexZ子元素。以下会介绍它们,并且说明其如何影响布局表现。
flexbox容器属性
flex-direction
该属性通过设置flex容器的主轴方向来指定flex元素在容器中排列的方向。
| flex-direction | 描述 |
|---|---|
| row(默认值) | 主轴为水平方向,起点在左端 |
| row-reverse | 主轴为水平方向,起点在右端 |
| column | 主轴为垂直方向,起点在上沿 |
| column-reverse | 主轴为垂直方向,起点在下沿 |
1 | .flex-container { |
row 方向为从左到右排列
1 | .flex-container { |
row-reverse方向,flex元素从右到左行排列
1 | .flex-container { |
column flex元素从上到下列排列
1 | .flex-container { |
选择column-reverse,flex元素从下到上列排列
flex-wrap
原始flexbox观念是容器在一条线上设置其子元素。flex-wrap属性用于控制flex容器中的子元素是在一条还是多条线上排列,并且控制多出来的行堆叠的方向。1
2
3
4.flex-container {
-webkit-flex-wrap: nowrap; //Safari
flex-wrap: nowrap;
}
flex元素一行排列,默认情况下会有一定缩放来适应元素的宽度
1 | .flex-container { |
flex元素在多行上按从上从左到右,从上到下的方式排列
1 | .flex-container { |
flex元素在多行上按从左到右,从下到上的方式排列
默认值:==nowrap==
flex-flow
该属性是flex-direction 和 flex-wrap 属性的简写。1
2
3
4.flex-container {
-webkit-flex-flow: ||; //Safari
flex-flow: ||;
}
默认值:==row nowrap==
justify-content
justify-content属性在flex容器当前行主轴线上对齐flex元素。它能分配多余可用空间,不管flex元素在一条线上表现为不可改变,或者可变但是已是最大尺寸。
1 | .flex-container { |
flex元素左对齐
1 | .flex-container { |
flex元素右对齐
1 | .flex-container { |
flex元素居中
1 | .flex-container { |
flex元素相邻元素之间有等距间隔,首位元素与容器边缘对齐

1 | .flex-container { |
flex元素每个元素周围有一定间距,首位元素亦如此
默认值:==flex-start==
align-items
flex元素沿当前容器交叉轴对齐,与justify-content相同,所不同的是方向。该属性设置所有元素的默认对齐方式,即使是未布局的元素。
1 | .flex-container { |
flex元素从交叉轴起点到终点填满整个高度
1 | .flex-container { |
flex元素按交叉轴起点对齐
1 | .flex-container { |
flex元素按交叉轴终点对齐
1 | .flex-container { |
flex元素按交叉轴中点对齐
1 | .flex-container{ |
flex元素按每一行基线对齐
默认值:==stretch==
align-center
该属性轴线有多余空间时,定义flex容器每一行的对齐方式,当只有一行元素时,与justify-content属性对齐方式相同。
1 | .flex-container { |
flex元素每行分配相等间距
1 | .flex-container { |
flex元素沿交叉轴起点对齐
1 | .flex-container { |
flex元素沿交叉轴终点对齐
1 | .flex-container { |
flex元素每行在容器内居中对齐
1 | .flex-container { |
flex元素每行有等距间隔,首位行与flex容器边缘对齐
1 | .flex-container { |
flex元素每行周围有相等空间
默认值:==stretch==
注意事项:该属性只有在flex容器包含多行元素时才会生效,若为当行元素,该属性无效。
flex容器注意事项
- 所有colunm-*属性对flex container 均无效。
- ::first-line与::first-letter伪元素对flex容器无效
flexbox元素属性
order
该属性控制flex容器中子元素排列顺序,数值越小,排列越靠前,默认值伪0。1
2
3
4.flex-item {
-webkit-order: ; //Safari
order: ;
}
该属性能在不重构HTML代码的情况下重新排列flex元素。
默认值:==0==
flex-grow
当容器有剩余空间时,该属性定义flex元素相对于其它元素的放大比例1
2
3
4.flex-ite {
-webkit-flex-grow: ; //Safari
flex-grow: ;
}
若所有元素均有相同flex-grow值,则在容器中它们大小相同。
第二个元素相对于其它元素而言占据更多空间
m默认值:==0==
注意事项:==负值无效==
flex-shrink
若空间不足,该属性定义元素相较于其它元素而言缩小比例1
2
3
4.flex-item {
-webkit-flex-shrink: ; //Safari
flex-shrink: ;
}
一般情况下,所有元素都可以被缩小,但若值设为0则保留原始大小
默认值:==1==
注意:==负值无效==
flex-basis
该属性与width和heigh属性取值相同,在分配多余空间之前定义flex元素的初始大小。1
2
3
4.flex-item {
-webkit-flex-basis: auto; //Safari
flex-basis: auto;
}
flex-basis确定了第四个元素的初始大小
m默认值:==auto==
flex
该属性是flex-grow, flex-shrink和flex-basis的简写。1
2
3
4.flex-item {
-webkit-flex: ; //Safari
flex: ;
}
默认值:==0 1 auto==
align-self
align-self属性允许单个元素与其它元素有不一样的对齐方式,可覆盖align-items属性。1
2
3
4.flex-item {
-webkit-align-self: auto | flex-start | flex-end | center | baseline | stretch; //Safari
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
第三、四个元素的align-self属性覆盖了其对齐方式
默认值:==auto==
注意:默认值为auto,表示继承父元素align-items属性,如果没有父元素,则等同于stretch
flex元素注意事项
- float,clear与vertical-align均对其无效,也不会使其脱离文档流。